data<-trade_zone_table
Countries<-c("Algeria",
"Angola",
"Benin",
"Botswana",
"Burkina Faso",
'Burundi',
"Cabo Verde",
"Cameroon",
'Central African Republic',
"Chad",
"Comoros",
"Cote d'Ivoire",
'Democratic Republic of the Congo',
"Djibouti",
"Egypt",
'Equatorial Guinea',
"Eritrea",
"Ethiopia",
"Gabon",
"Gambia",
"Ghana",
"Guinea",
"Guinea-Bissau",
"Kenya",
"Lesotho",
"Liberia",
"Libya",
"Madagascar",
"Malawi",
"Mali",
"Mauritania",
"Mauritius",
"Morocco",
"Mozambique",
"Namibia",
"Niger",
"Nigeria",
'Republic of the Congo',
"Rwanda",
'Sao Tome and Principe',
'Senegal',
'Seychelles',
'Sierra Leone',
'Somalia',
'South Africa',
'South Sudan',
'Sudan',
'Swaziland',
'Tanzania',
'Togo',
'Tunisia',
'Uganda',
'Zambia',
'Zimbabwe'
)
library(dplyr)
data[is.na(data)]<-0
data
# Country_1 <-c(1,1,0,0)
# Country_2 <-c(1,0,1,0)
# Country_3 <-c(1,0,1,0)
# Country_4 <-c(0,1,0,1)
# Country_5 <-c(0,0,1,1)
# 
# Countries<-c("Country_1","Country_2","Country_3","Country_4","Country_5")
# Zone_1<-c(1,1,1,0,0)
# Zone_2<-c(1,0,0,1,0)
# Zone_3<-c(0,1,1,0,1)
# Zone_4<-c(0,0,0,1,1)
library(tidygraph)
data<-as.matrix(data)
rownames(data) <- paste(Countries)
as_tbl_graph(graph.incidence(data))
# A tbl_graph: 70 nodes and 153 edges
#
# A bipartite simple graph with 1 component
#
# Node Data: 70 x 2 (active)
  type  name        
  <lgl> <chr>       
1 FALSE Algeria     
2 FALSE Angola      
3 FALSE Benin       
4 FALSE Botswana    
5 FALSE Burkina Faso
6 FALSE Burundi     
# ... with 64 more rows
#
# Edge Data: 153 x 2
   from    to
  <int> <int>
1     1    67
2     2    55
3     2    57
# ... with 150 more rows
library(ggraph)
as_tbl_graph(graph.incidence(data)) %>% 
  ggraph()+
  geom_node_point(aes(shape = type, size = 20), show.legend = F)+
  geom_node_text(aes(label = name), colour = 'black', vjust = 4)+
  geom_edge_link()+
  theme_graph()
Using `nicely` as default layout

data_project<- bipartite.projection(graph.incidence(data)) 
data_project
$proj1
IGRAPH f28c147 UNW- 54 728 -- 
+ attr: name (v/c), weight (e/n)
+ edges from f28c147 (vertex names):
 [1] Algeria--Libya                    Algeria--Mauritania              
 [3] Algeria--Morocco                  Algeria--Tunisia                 
 [5] Angola --Botswana                 Angola --Comoros                 
 [7] Angola --Cote d'Ivoire            Angola --Lesotho                 
 [9] Angola --Madagascar               Angola --Malawi                  
[11] Angola --Mauritius                Angola --Mozambique              
[13] Angola --Namibia                  Angola --Seychelles              
[15] Angola --South Africa             Angola --Tanzania                
+ ... omitted several edges

$proj2
IGRAPH 9f28a5a UNW- 16 42 -- 
+ attr: name (v/c), weight (e/n)
+ edges from 9f28a5a (vertex names):
 [1] SADC   --ECCAS   SADC   --SACU    SADC   --CEPGL   SADC   --COMESA  SADC   --CEN-SAD
 [6] SADC   --EAC     SACU   --WAMZ    SACU   --ECOWAS  SACU   --CEN-SAD SACU   --COMESA 
[11] ECCAS  --CEPGL   ECCAS  --EAC     ECCAS  --COMESA  ECCAS  --CEMAC   ECCAS  --CEN-SAD
[16] CEPGL  --EAC     CEPGL  --COMESA  EAC    --COMESA  EAC    --CEN-SAD EAC    --IGAD   
[21] EAC    --IGAD__1 CEMAC  --CEN-SAD WAMZ   --ECOWAS  WAMZ   --CEN-SAD WAMZ   --MRU    
[26] MRU    --ECOWAS  MRU    --UEMCA   MRU    --CEN-SAD ECOWAS --UEMCA   ECOWAS --CEN-SAD
[31] ECOWAS --LGA     LGA    --UEMCA   LGA    --CEN-SAD UEMCA  --CEN-SAD CEN-SAD--COMESA 
[36] CEN-SAD--IGAD    CEN-SAD--IGAD__1 CEN-SAD--UMA     UMA    --COMESA  COMESA --IGAD   
+ ... omitted several edges
as_tbl_graph(data_project$proj1)
# A tbl_graph: 54 nodes and 728 edges
#
# An undirected simple graph with 1 component
#
# Node Data: 54 x 1 (active)
  name        
  <chr>       
1 Algeria     
2 Angola      
3 Benin       
4 Botswana    
5 Burkina Faso
6 Burundi     
# ... with 48 more rows
#
# Edge Data: 728 x 3
   from    to weight
  <int> <int>  <dbl>
1     1    27      1
2     1    31      1
3     1    33      1
# ... with 725 more rows
country_data<-as_tbl_graph(data_project$proj1)
as_tbl_graph(data_project$proj1) %>% 
  ggraph()+
  geom_node_point(aes(size = 20), show.legend = F)+
  geom_node_text(aes(label = name), colour = 'black', vjust = 4)+
  geom_edge_link()+
  theme_graph()
Using `nicely` as default layout

# random_graph <- sample_gnp(n = 100, 0.2)
graph_data<-as_tbl_graph(data)
# 
# GLI_rg <- as_tbl_graph(country_data) %>%
#   mutate(size = graph_order(),
#          edges = graph_size(),
#          density = edge_density(country_data),
#          average_distance = graph_mean_dist(),
#          trans = transitivity(country_data, type = "global")
#   ) %>%
#   as.data.frame()
# 
# GLI_rg
info<-country_data%>%
  activate(nodes)%>%
  mutate(betweenness = centrality_betweenness(normalized = TRUE),
         closeness = centrality_closeness(normalized = TRUE),
         transitivity = transitivity(country_data,type = "local"),
         degree = degree(country_data))%>%
  select(name,betweenness,closeness,transitivity,degree)%>%
  as.data.frame()
info
library(ggplot2)
data.frame(info)%>%
  ggplot(aes(x=betweenness,y=closeness, label=name))+
  geom_point()+geom_text()+scale_x_log10()+geom_smooth(method="lm",size = 0.5)+ylab("Closeness Centrality")+xlab("betweenness")

#define variables to all to allinfo variable, ie gdp_data and mortality stats
allinfo$GDP.growth.rate<-as.numeric(allinfo$GDP.growth.rate)
data.frame(allinfo)%>%
  ggplot(aes(x=GDP.perCapita,y=closeness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>%
  ggplot(aes(x=GDP.perCapita,y=betweenness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>%
  ggplot(aes(y=GDP.perCapita,x=degree, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>%
  ggplot(aes(x=African.rank,y=closeness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("African.rank")+ylab("closeness")

data.frame(allinfo)%>%
  ggplot(aes(x=African.rank,y=betweenness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("African.rank")+ylab("betweenness")

data.frame(allinfo)%>%
  ggplot(aes(x=African.rank,y=degree, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>%
  ggplot(aes(x=degree,y=African.rank, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>%
  ggplot(aes(x=World.rank,y=closeness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("World.rank")+ylab("closeness")

data.frame(allinfo)%>%
  ggplot(aes(x=World.rank,y=betweenness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("World.rank")+ylab("betweenness")

data.frame(allinfo)%>%
  ggplot(aes(x=World.rank,y=degree, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("World.rank")+ylab("degree")

data.frame(allinfo)%>%
  ggplot(aes(x=degree,y=World.rank, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+ylab("World.rank")+xlab("degree")

data.frame(allinfo)%>%
  ggplot(aes(x=GDP.from.agriculture,y=closeness, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()+xlab("GDP.from.agriculture")+ylab("closeness")
Error in Math.factor(x, base) : 'log' not meaningful for factors

rr data.frame(allinfo)%>% ggplot(aes(x=GDP..industry,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(..industry)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP..industry,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(..industry)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP..industry,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(..industry)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=closeness,y=GDP..industry, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=betweenness,y=GDP..industry, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=degree,y=GDP..industry, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.services,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.services)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.services,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.services)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.services,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.services)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.estimates,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.estimates)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.estimates,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.estimates)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.estimates,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.estimates)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.growth.rate,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.growth.rate)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.growth.rate,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.growth.rate)+ylab()

rr data.frame(allinfo)%>% ggplot(aes(x=GDP.growth.rate,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()+xlab(.growth.rate)+ylab()

rr ggplot(data.frame(allinfo),aes(x=name,y=closeness))+geom_bar(stat=)+theme(axis.text.x = element_text(angle = 90, hjust = 1))

rr ggplot(data.frame(allinfo),aes(x=name,y=betweenness))+geom_bar(stat=)+theme(axis.text.x = element_text(angle = 90, hjust = 1))

rr ggplot(data.frame(allinfo),aes(x=name,y=degree))+geom_bar(stat=)+theme(axis.text.x = element_text(angle = 90, hjust = 1))

rr data.frame(allinfo)%>% ggplot(aes(x=closeness,y=LifeExp, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=betweenness,y=LifeExp, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=degree,y=LifeExp, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Neonatel,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Neonatel,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Neonatel,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=under_5,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=under_5,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=under_5,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=under_5,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=under_5,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=under_5,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Male_adult_mortality,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Male_adult_mortality,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=Male_adult_mortality,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Male_adult_mortality,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Male_adult_mortality,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=Male_adult_mortality,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=female_adult_mortality,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=female_adult_mortality,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(x=female_adult_mortality,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=female_adult_mortality,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=female_adult_mortality,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr data.frame(allinfo)%>% ggplot(aes(y=female_adult_mortality,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

rr

data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>% ggplot(aes(x=Infant_Mortality,y=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=closeness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=betweenness, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()

data.frame(allinfo)%>% ggplot(aes(y=Infant_Mortality,x=degree, label=name))+ geom_point()+geom_text()+geom_smooth(method=,size = 0.5)+scale_x_log10()+scale_y_log10()


data.frame(allinfo)%>%
  ggplot(aes(y=closeness,x=degree, label=name))+
  geom_point()+geom_text()+geom_smooth(method="lm",size = 0.5)+scale_x_log10()+scale_y_log10()
allinfo<-data.frame(c(info, gdp_data, mortal))
trade_info <-data.frame(allinfo, african_trade_items)
data.frame(trade_info) %>% 
  ggplot(aes(x=resource, y=GDP.perCapita, label=name.1, color=resource)) +
  geom_point() +
  geom_text() +
  geom_smooth(method="lm", size=0.5) +
  ylab("GDP") + xlab("Country") +
  labs(title="Ordered Bar Chart", 
  subtitle="Make Vs Avg. Mileage", 
  caption="source: mpg") + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6))

temp <- trade_info %>%
  group_by(name.1) %>%
  mutate(GDP_industry = GDP.perCapita*(GDP..industry/100),
         GDP_agri = GDP.perCapita*(GDP.from.agriculture/100),
         GDP_services = GDP.perCapita*(GDP.services/100)) %>%
  select(GDP.perCapita,GDP_industry,GDP_agri,GDP_services)
Adding missing grouping variables: `name.1`
data.frame(trade_info) %>% 
  ggplot(aes(x=name.1, y=GDP.perCapita, label=name.1, fill=resource)) +
  facet_wrap(~resource) +
  geom_col() +
  geom_text() +
  geom_smooth(method="lm", size=0.5) +
  ylab("GDP") + xlab("Country") +
  labs(title="Ordered Bar Chart", 
  subtitle="Make Vs Avg. Mileage", 
  caption="source: mpg") + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6))

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KZGF0YTwtdHJhZGVfem9uZV90YWJsZQoKCmBgYAoKYGBge3J9CkNvdW50cmllczwtYygiQWxnZXJpYSIsCiJBbmdvbGEiLAoiQmVuaW4iLAoiQm90c3dhbmEiLAoiQnVya2luYSBGYXNvIiwKJ0J1cnVuZGknLAoiQ2FibyBWZXJkZSIsCiJDYW1lcm9vbiIsCidDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnLAoiQ2hhZCIsCiJDb21vcm9zIiwKIkNvdGUgZCdJdm9pcmUiLAonRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28nLAoiRGppYm91dGkiLAoiRWd5cHQiLAonRXF1YXRvcmlhbCBHdWluZWEnLAoiRXJpdHJlYSIsCiJFdGhpb3BpYSIsCiJHYWJvbiIsCiJHYW1iaWEiLAoiR2hhbmEiLAoiR3VpbmVhIiwKIkd1aW5lYS1CaXNzYXUiLAoiS2VueWEiLAoiTGVzb3RobyIsCiJMaWJlcmlhIiwKIkxpYnlhIiwKIk1hZGFnYXNjYXIiLAoiTWFsYXdpIiwKIk1hbGkiLAoiTWF1cml0YW5pYSIsCiJNYXVyaXRpdXMiLAoiTW9yb2NjbyIsCiJNb3phbWJpcXVlIiwKIk5hbWliaWEiLAoiTmlnZXIiLAoiTmlnZXJpYSIsCidSZXB1YmxpYyBvZiB0aGUgQ29uZ28nLAoiUndhbmRhIiwKJ1NhbyBUb21lIGFuZCBQcmluY2lwZScsCidTZW5lZ2FsJywKJ1NleWNoZWxsZXMnLAonU2llcnJhIExlb25lJywKJ1NvbWFsaWEnLAonU291dGggQWZyaWNhJywKJ1NvdXRoIFN1ZGFuJywKJ1N1ZGFuJywKJ1N3YXppbGFuZCcsCidUYW56YW5pYScsCidUb2dvJywKJ1R1bmlzaWEnLAonVWdhbmRhJywKJ1phbWJpYScsCidaaW1iYWJ3ZScKKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKZGF0YVtpcy5uYShkYXRhKV08LTAKZGF0YQpgYGAKCgpgYGB7cn0KCgojIENvdW50cnlfMSA8LWMoMSwxLDAsMCkKIyBDb3VudHJ5XzIgPC1jKDEsMCwxLDApCiMgQ291bnRyeV8zIDwtYygxLDAsMSwwKQojIENvdW50cnlfNCA8LWMoMCwxLDAsMSkKIyBDb3VudHJ5XzUgPC1jKDAsMCwxLDEpCiMgCiMgQ291bnRyaWVzPC1jKCJDb3VudHJ5XzEiLCJDb3VudHJ5XzIiLCJDb3VudHJ5XzMiLCJDb3VudHJ5XzQiLCJDb3VudHJ5XzUiKQojIFpvbmVfMTwtYygxLDEsMSwwLDApCiMgWm9uZV8yPC1jKDEsMCwwLDEsMCkKIyBab25lXzM8LWMoMCwxLDEsMCwxKQojIFpvbmVfNDwtYygwLDAsMCwxLDEpCmxpYnJhcnkodGlkeWdyYXBoKQoKZGF0YTwtYXMubWF0cml4KGRhdGEpCnJvd25hbWVzKGRhdGEpIDwtIHBhc3RlKENvdW50cmllcykKCmFzX3RibF9ncmFwaChncmFwaC5pbmNpZGVuY2UoZGF0YSkpCgoKYGBgCgoKYGBge3J9CmxpYnJhcnkoZ2dyYXBoKQphc190YmxfZ3JhcGgoZ3JhcGguaW5jaWRlbmNlKGRhdGEpKSAlPiUgCiAgZ2dyYXBoKCkrCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaGFwZSA9IHR5cGUsIHNpemUgPSAyMCksIHNob3cubGVnZW5kID0gRikrCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIGNvbG91ciA9ICdibGFjaycsIHZqdXN0ID0gNCkrCiAgZ2VvbV9lZGdlX2xpbmsoKSsKICB0aGVtZV9ncmFwaCgpCmBgYAoKYGBge3J9CmRhdGFfcHJvamVjdDwtIGJpcGFydGl0ZS5wcm9qZWN0aW9uKGdyYXBoLmluY2lkZW5jZShkYXRhKSkgCmRhdGFfcHJvamVjdAoKYXNfdGJsX2dyYXBoKGRhdGFfcHJvamVjdCRwcm9qMSkKY291bnRyeV9kYXRhPC1hc190YmxfZ3JhcGgoZGF0YV9wcm9qZWN0JHByb2oxKQpgYGAKCmBgYHtyfQphc190YmxfZ3JhcGgoZGF0YV9wcm9qZWN0JHByb2oxKSAlPiUgCiAgZ2dyYXBoKCkrCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplID0gMjApLCBzaG93LmxlZ2VuZCA9IEYpKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBjb2xvdXIgPSAnYmxhY2snLCB2anVzdCA9IDQpKwogIGdlb21fZWRnZV9saW5rKCkrCiAgdGhlbWVfZ3JhcGgoKQoKCmBgYAoKYGBge3J9CiMgcmFuZG9tX2dyYXBoIDwtIHNhbXBsZV9nbnAobiA9IDEwMCwgMC4yKQpncmFwaF9kYXRhPC1hc190YmxfZ3JhcGgoZGF0YSkKCiMgCiMgR0xJX3JnIDwtIGFzX3RibF9ncmFwaChjb3VudHJ5X2RhdGEpICU+JQojICAgbXV0YXRlKHNpemUgPSBncmFwaF9vcmRlcigpLAojICAgICAgICAgIGVkZ2VzID0gZ3JhcGhfc2l6ZSgpLAojICAgICAgICAgIGRlbnNpdHkgPSBlZGdlX2RlbnNpdHkoY291bnRyeV9kYXRhKSwKIyAgICAgICAgICBhdmVyYWdlX2Rpc3RhbmNlID0gZ3JhcGhfbWVhbl9kaXN0KCksCiMgICAgICAgICAgdHJhbnMgPSB0cmFuc2l0aXZpdHkoY291bnRyeV9kYXRhLCB0eXBlID0gImdsb2JhbCIpCiMgICApICU+JQojICAgYXMuZGF0YS5mcmFtZSgpCiMgCiMgR0xJX3JnCgppbmZvPC1jb3VudHJ5X2RhdGElPiUKICBhY3RpdmF0ZShub2RlcyklPiUKICBtdXRhdGUoYmV0d2Vlbm5lc3MgPSBjZW50cmFsaXR5X2JldHdlZW5uZXNzKG5vcm1hbGl6ZWQgPSBUUlVFKSwKICAgICAgICAgY2xvc2VuZXNzID0gY2VudHJhbGl0eV9jbG9zZW5lc3Mobm9ybWFsaXplZCA9IFRSVUUpLAogICAgICAgICB0cmFuc2l0aXZpdHkgPSB0cmFuc2l0aXZpdHkoY291bnRyeV9kYXRhLHR5cGUgPSAibG9jYWwiKSwKICAgICAgICAgZGVncmVlID0gZGVncmVlKGNvdW50cnlfZGF0YSkpJT4lCiAgc2VsZWN0KG5hbWUsYmV0d2Vlbm5lc3MsY2xvc2VuZXNzLHRyYW5zaXRpdml0eSxkZWdyZWUpJT4lCiAgYXMuZGF0YS5mcmFtZSgpCmluZm8KCgoKCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKCmRhdGEuZnJhbWUoaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9YmV0d2Vlbm5lc3MseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrc2NhbGVfeF9sb2cxMCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3lsYWIoIkNsb3NlbmVzcyBDZW50cmFsaXR5IikreGxhYigiYmV0d2Vlbm5lc3MiKQoKYGBgCmBgYHtyfQojZGVmaW5lIHZhcmlhYmxlcyB0byBhbGwgdG8gYWxsaW5mbyB2YXJpYWJsZSwgaWUgZ2RwX2RhdGEgYW5kIG1vcnRhbGl0eSBzdGF0cwoKCgphbGxpbmZvJEdEUC5ncm93dGgucmF0ZTwtYXMubnVtZXJpYyhhbGxpbmZvJEdEUC5ncm93dGgucmF0ZSkKCgoKYGBgCgoKYGBge3J9CgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUdEUC5wZXJDYXBpdGEseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAucGVyQ2FwaXRhLHk9YmV0d2Vlbm5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1HRFAucGVyQ2FwaXRhLHg9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmBgYAoKCmBgYHtyfQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1BZnJpY2FuLnJhbmsseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJBZnJpY2FuLnJhbmsiKSt5bGFiKCJjbG9zZW5lc3MiKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1BZnJpY2FuLnJhbmsseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkFmcmljYW4ucmFuayIpK3lsYWIoImJldHdlZW5uZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9QWZyaWNhbi5yYW5rLHk9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PWRlZ3JlZSx5PUFmcmljYW4ucmFuaywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgoKYGBgCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1Xb3JsZC5yYW5rLHk9Y2xvc2VuZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkreGxhYigiV29ybGQucmFuayIpK3lsYWIoImNsb3NlbmVzcyIpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PVdvcmxkLnJhbmsseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIldvcmxkLnJhbmsiKSt5bGFiKCJiZXR3ZWVubmVzcyIpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PVdvcmxkLnJhbmsseT1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJXb3JsZC5yYW5rIikreWxhYigiZGVncmVlIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9ZGVncmVlLHk9V29ybGQucmFuaywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3lsYWIoIldvcmxkLnJhbmsiKSt4bGFiKCJkZWdyZWUiKQoKYGBgCgoKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuZnJvbS5hZ3JpY3VsdHVyZSx5PWNsb3NlbmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5mcm9tLmFncmljdWx0dXJlIikreWxhYigiY2xvc2VuZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLmZyb20uYWdyaWN1bHR1cmUseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5mcm9tLmFncmljdWx0dXJlIikreWxhYigiYmV0d2Vlbm5lc3MiKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuZnJvbS5hZ3JpY3VsdHVyZSx5PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5mcm9tLmFncmljdWx0dXJlIikreWxhYigiZGVncmVlIikKCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PWNsb3NlbmVzcyx5PUdEUC5mcm9tLmFncmljdWx0dXJlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9YmV0d2Vlbm5lc3MseT1HRFAuZnJvbS5hZ3JpY3VsdHVyZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PWRlZ3JlZSx5PUdEUC5mcm9tLmFncmljdWx0dXJlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUdEUC4uaW5kdXN0cnkseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJHRFAuLmluZHVzdHJ5IikreWxhYigiY2xvc2VuZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLi5pbmR1c3RyeSx5PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkreGxhYigiR0RQLi5pbmR1c3RyeSIpK3lsYWIoImJldHdlZW5uZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLi5pbmR1c3RyeSx5PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC4uaW5kdXN0cnkiKSt5bGFiKCJkZWdyZWUiKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1jbG9zZW5lc3MseT1HRFAuLmluZHVzdHJ5LCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9YmV0d2Vlbm5lc3MseT1HRFAuLmluZHVzdHJ5LCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9ZGVncmVlLHk9R0RQLi5pbmR1c3RyeSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuc2VydmljZXMseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJHRFAuc2VydmljZXMiKSt5bGFiKCJjbG9zZW5lc3MiKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuc2VydmljZXMseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5zZXJ2aWNlcyIpK3lsYWIoImJldHdlZW5uZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLnNlcnZpY2VzLHk9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkreGxhYigiR0RQLnNlcnZpY2VzIikreWxhYigiZGVncmVlIikKCmBgYAoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUdEUC5lc3RpbWF0ZXMseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJHRFAuZXN0aW1hdGVzIikreWxhYigiY2xvc2VuZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLmVzdGltYXRlcyx5PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkreGxhYigiR0RQLmVzdGltYXRlcyIpK3lsYWIoImJldHdlZW5uZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLmVzdGltYXRlcyx5PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5lc3RpbWF0ZXMiKSt5bGFiKCJkZWdyZWUiKQoKYGBgCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuZ3Jvd3RoLnJhdGUseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKSt4bGFiKCJHRFAuZ3Jvd3RoLnJhdGUiKSt5bGFiKCJjbG9zZW5lc3MiKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1HRFAuZ3Jvd3RoLnJhdGUseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpK3hsYWIoIkdEUC5ncm93dGgucmF0ZSIpK3lsYWIoImJldHdlZW5uZXNzIikKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9R0RQLmdyb3d0aC5yYXRlLHk9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkreGxhYigiR0RQLmdyb3d0aC5yYXRlIikreWxhYigiZGVncmVlIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEuZnJhbWUoYWxsaW5mbyksYWVzKHg9bmFtZSx5PWNsb3NlbmVzcykpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKCmdncGxvdChkYXRhLmZyYW1lKGFsbGluZm8pLGFlcyh4PW5hbWUseT1iZXR3ZWVubmVzcykpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKCmdncGxvdChkYXRhLmZyYW1lKGFsbGluZm8pLGFlcyh4PW5hbWUseT1kZWdyZWUpKStnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpK3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PWNsb3NlbmVzcyx5PUxpZmVFeHAsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1iZXR3ZWVubmVzcyx5PUxpZmVFeHAsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1kZWdyZWUseT1MaWZlRXhwLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmBgYApgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9TmVvbmF0ZWwseD1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1OZW9uYXRlbCx4PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9TmVvbmF0ZWwseD1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9SW5mYW50X01vcnRhbGl0eSx5PWNsb3NlbmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUluZmFudF9Nb3J0YWxpdHkseT1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUluZmFudF9Nb3J0YWxpdHkseT1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9SW5mYW50X01vcnRhbGl0eSx4PWNsb3NlbmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh5PUluZmFudF9Nb3J0YWxpdHkseD1iZXR3ZWVubmVzcywgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh5PUluZmFudF9Nb3J0YWxpdHkseD1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD11bmRlcl81LHk9Y2xvc2VuZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9dW5kZXJfNSx5PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9dW5kZXJfNSx5PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT11bmRlcl81LHg9Y2xvc2VuZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9dW5kZXJfNSx4PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9dW5kZXJfNSx4PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCmBgYAoKCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9TWFsZV9hZHVsdF9tb3J0YWxpdHkseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1NYWxlX2FkdWx0X21vcnRhbGl0eSx5PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9TWFsZV9hZHVsdF9tb3J0YWxpdHkseT1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9TWFsZV9hZHVsdF9tb3J0YWxpdHkseD1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1NYWxlX2FkdWx0X21vcnRhbGl0eSx4PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9TWFsZV9hZHVsdF9tb3J0YWxpdHkseD1kZWdyZWUsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1mZW1hbGVfYWR1bHRfbW9ydGFsaXR5LHk9Y2xvc2VuZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9ZmVtYWxlX2FkdWx0X21vcnRhbGl0eSx5PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHg9ZmVtYWxlX2FkdWx0X21vcnRhbGl0eSx5PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1mZW1hbGVfYWR1bHRfbW9ydGFsaXR5LHg9Y2xvc2VuZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9ZmVtYWxlX2FkdWx0X21vcnRhbGl0eSx4PWJldHdlZW5uZXNzLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCmRhdGEuZnJhbWUoYWxsaW5mbyklPiUKICBnZ3Bsb3QoYWVzKHk9ZmVtYWxlX2FkdWx0X21vcnRhbGl0eSx4PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCmBgYApgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh4PUluZmFudF9Nb3J0YWxpdHkseT1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1JbmZhbnRfTW9ydGFsaXR5LHk9YmV0d2Vlbm5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeD1JbmZhbnRfTW9ydGFsaXR5LHk9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKCgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh5PUluZmFudF9Nb3J0YWxpdHkseD1jbG9zZW5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1JbmZhbnRfTW9ydGFsaXR5LHg9YmV0d2Vlbm5lc3MsIGxhYmVsPW5hbWUpKSsKICBnZW9tX3BvaW50KCkrZ2VvbV90ZXh0KCkrZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsc2l6ZSA9IDAuNSkrc2NhbGVfeF9sb2cxMCgpK3NjYWxlX3lfbG9nMTAoKQoKZGF0YS5mcmFtZShhbGxpbmZvKSU+JQogIGdncGxvdChhZXMoeT1JbmZhbnRfTW9ydGFsaXR5LHg9ZGVncmVlLCBsYWJlbD1uYW1lKSkrCiAgZ2VvbV9wb2ludCgpK2dlb21fdGV4dCgpK2dlb21fc21vb3RoKG1ldGhvZD0ibG0iLHNpemUgPSAwLjUpK3NjYWxlX3hfbG9nMTAoKStzY2FsZV95X2xvZzEwKCkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CgpkYXRhLmZyYW1lKGFsbGluZm8pJT4lCiAgZ2dwbG90KGFlcyh5PWNsb3NlbmVzcyx4PWRlZ3JlZSwgbGFiZWw9bmFtZSkpKwogIGdlb21fcG9pbnQoKStnZW9tX3RleHQoKStnZW9tX3Ntb290aChtZXRob2Q9ImxtIixzaXplID0gMC41KStzY2FsZV94X2xvZzEwKCkrc2NhbGVfeV9sb2cxMCgpCgpgYGAKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmFsbGluZm88LWRhdGEuZnJhbWUoYyhpbmZvLCBnZHBfZGF0YSwgbW9ydGFsKSkKdHJhZGVfaW5mbyA8LWRhdGEuZnJhbWUoYWxsaW5mbywgYWZyaWNhbl90cmFkZV9pdGVtcykKCmRhdGEuZnJhbWUodHJhZGVfaW5mbykgJT4lIAogIGdncGxvdChhZXMoeD1yZXNvdXJjZSwgeT1HRFAucGVyQ2FwaXRhLCBsYWJlbD1uYW1lLjEsIGNvbG9yPXJlc291cmNlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzaXplPTAuNSkgKwogIHlsYWIoIkdEUCIpICsgeGxhYigiQ291bnRyeSIpICsKICBsYWJzKHRpdGxlPSJPcmRlcmVkIEJhciBDaGFydCIsIAogIHN1YnRpdGxlPSJNYWtlIFZzIEF2Zy4gTWlsZWFnZSIsIAogIGNhcHRpb249InNvdXJjZTogbXBnIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkKCmBgYAoKYGBge3IgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwIH0KdGVtcCA8LSB0cmFkZV9pbmZvICU+JQogIGdyb3VwX2J5KG5hbWUuMSkgJT4lCiAgbXV0YXRlKEdEUF9pbmR1c3RyeSA9IEdEUC5wZXJDYXBpdGEqKEdEUC4uaW5kdXN0cnkvMTAwKSwKICAgICAgICAgR0RQX2FncmkgPSBHRFAucGVyQ2FwaXRhKihHRFAuZnJvbS5hZ3JpY3VsdHVyZS8xMDApLAogICAgICAgICBHRFBfc2VydmljZXMgPSBHRFAucGVyQ2FwaXRhKihHRFAuc2VydmljZXMvMTAwKSkgJT4lCiAgc2VsZWN0KEdEUC5wZXJDYXBpdGEsR0RQX2luZHVzdHJ5LEdEUF9hZ3JpLEdEUF9zZXJ2aWNlcykKCmRhdGEuZnJhbWUodHJhZGVfaW5mbykgJT4lIAogIGdncGxvdChhZXMoeD1uYW1lLjEsIHk9R0RQLnBlckNhcGl0YSwgbGFiZWw9bmFtZS4xLCBmaWxsPXJlc291cmNlKSkgKwogIGZhY2V0X3dyYXAofnJlc291cmNlKSArCiAgZ2VvbV9jb2woKSArCiAgZ2VvbV90ZXh0KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzaXplPTAuNSkgKwogIHlsYWIoIkdEUCIpICsgeGxhYigiQ291bnRyeSIpICsKICBsYWJzKHRpdGxlPSJPcmRlcmVkIEJhciBDaGFydCIsIAogIHN1YnRpdGxlPSJNYWtlIFZzIEF2Zy4gTWlsZWFnZSIsIAogIGNhcHRpb249InNvdXJjZTogbXBnIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT02NSwgdmp1c3Q9MC42KSkKYGBg